Some devices contain no software, and some contain only simple embedded software that is rarely if ever modified after being installed. But many different devices used today—such as smartphones, tablet computers, laptop computers, and modern automobiles, to name just a few—contain complex software which includes separate updateable libraries used by one or more applications. In some software development environments, some or all of these software libraries are part of a framework. Some of the commercially available software frameworks include Java® and JavaScript® frameworks (marks of Oracle America, Inc.), Oracle® Application Development Framework (mark of Oracle America, Inc.), various model-view-controller (MVC) frameworks, various web application frameworks, and the widely used Microsoft® .NET™ framework (marks of Microsoft Corporation).
Using separately updateable libraries promotes reuse of code, helps limit the recompilation needed when source code is changed, and helps organize large programs in ways that make them easier to develop and maintain. But the possibility that different versions of a library could be encountered when an application is invoked also creates challenges. These challenges are complicated by an established practice of updating framework libraries as a group, and by the fact that different libraries used in an application often are provided by—and updated by—different vendors.